from django.shortcuts import render, redirect, HttpResponse, reverse
from app01 import models
from django.views import View
from functools import wraps


# Create your views here.

# 登录界面
class Login(View):

    def post(self, request):
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        print(user, pwd)

        if user == 'liangliang' and pwd == '123456':
            # 登录成功后，保存登录状态到cookie
            url = request.GET.get('url')
            if url:
                return_url = url
            else:
                return_url = reverse('publisher')
            ret = redirect(return_url)
            # ret.set_cookie('is_login', '1')  # 普通cookie
            # ret.set_signed_cookie('is_login', '1', salt='s28')  # 加密cookie

            request.session['is_login'] = 1  # 设置session

            return ret

        else:
            return render(request, 'login.html', {'error': '输入错误'})

    def get(self, request):
        return render(request, 'login.html', {'error': ''})


def login_required(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        # is_login = request.COOKIES.get('is_login')  # 普通cookie接收
        # is_login = request.get_signed_cookie('is_login', salt='s28', default='')  # 加密接收cookie
        is_login = request.session.get('is_login')  # 取出来的为数字
        print(is_login)

        if is_login != 1:
            # 没有登录 跳转到登录页面
            return redirect('/login/?url={}'.format(request.path_info))
        ret = func(request, *args, **kwargs)
        return ret

    return inner


def logout(request):
    # 清除cookie（某个键值对）
    ret = redirect('/login/')
    # ret.delete_cookie('is_login')
    # del request.session['is_login']  # 方法一
    request.session.pop('is_login')  # 方法一

    # 重定向
    return ret


# 出版社列表
@login_required
def publisher_list(request):
    # 逻辑
    # 获取出版社的所有信息
    all_publishers = models.Publisher.objects.all().order_by('-id')  # 对象列表
    # for i in all_publishers:
    #     print(i)
    #     print(i.id)
    #     print(i.name)
    # 返回一个页面，页面包括
    return render(request, 'publisher_list.html', {'all_publishers': all_publishers})


# 新增出版社
# def publisher_add(request):
#     if request.method == 'POST':
#
#         # POST请求
#         # 获取用户输入的数据
#         pub_name = request.POST.get('pub_name')
#         # print(pub_name)
#
#         # 排除空字符串
#         if not pub_name:
#             return render(request, 'publisher_add.html', {'error': '出版社名称不能为空'})
#
#         # 排除数据库重复的数据
#         if models.Publisher.objects.filter(name=pub_name):
#             return render(request, 'publisher_add.html', {'error': '出版社名称已经存在'})
#         # 将数据新增到数据库中
#         models.Publisher.objects.create(name=pub_name)
#         # print(ret, type(ret))
#         # 返回一个重定向展示出版社
#         return redirect('/publisher_list')
#
#     # get请求返回一个页面，页面中包含一个form表单
#     return render(request, 'publisher_add.html')


# 新增出版社CBV
from django.views import View


class PublisherAdd(View):

    @login_required
    def get(self, request):
        # 处理get请求
        # get请求返回一个页面，页面中包含一个form表单
        return render(request, 'publisher_add.html')

    @login_required
    def post(self, request):
        # POST请求
        # 获取用户输入的数据
        pub_name = request.POST.get('pub_name')
        # print(pub_name)

        # 排除空字符串
        if not pub_name:
            return render(request, 'publisher_add.html', {'error': '出版社名称不能为空'})

        # 排除数据库重复的数据
        if models.Publisher.objects.filter(name=pub_name):
            return render(request, 'publisher_add.html', {'error': '出版社名称已经存在'})
        # 将数据新增到数据库中
        models.Publisher.objects.create(name=pub_name)
        # print(ret, type(ret))
        # 返回一个重定向展示出版社
        return redirect('/publisher_list')


@login_required
# 删除对应出版社
def publisher_del(request):
    # 获取要删除的数据id
    pk = request.GET.get('pk')
    print(pk)
    # 根据id到数据库删除
    # 先查询出数据
    # models.Publisher.objects.get(id=pk).delete()  # 查询到一个对象，并删除该对象。如果查不到会报错
    for i in models.Publisher.objects.filter(id=pk):  # （优化）查询到一个对象列表，并删除该对象
        i.delete()
    # get请求返回出版社页面
    return redirect('/publisher_list/')


@login_required
# 修改内容
def publisher_edit(request):
    # 获取数据id
    pk = request.GET.get('pk')
    # 获取对应id的数据库内容
    pub_obj = models.Publisher.objects.get(pk=pk)

    if request.method == 'GET':
        # get请求返回新form表单页面，内有原始的数据
        return render(request, 'publisher_edit.html', {'pub_obj': pub_obj})

    else:
        # 获取用户提交的出版社名称
        pub_name = request.POST.get('pub_name')
        # 替换数据库中对应的数据
        pub_obj.name = pub_name  # 只是修改了内存中的内容，数据库还没有操作
        # 将修改操作提交到数据库
        pub_obj.save()
        # 返回展示的页面
        return redirect('/publisher_list/')


@login_required
# 展示书籍
def book_list(request):
    # 查询书籍
    all_books = models.Book.objects.all()
    # for book in all_books:
    #     print(book)
    #     print(book.pk)
    #     print(book.name)
    #     print(book.publisher)
    #
    # 返回一个展示页面
    return render(request, 'book_list.html', {"all_books": all_books})


@login_required
# 新增书籍
def book_add(request):
    error = ''
    if request.method == 'POST':
        # post获取用户提交数据
        book_name = request.POST.get('book_name')
        pub_id = request.POST.get('pub_id')

        if not book_name:
            error = '出版社书名不能为空'

        elif models.Book.objects.filter(name=book_name):
            error = '出版社名字不能重复'

        else:
            # 将数据插入到数据库中
            models.Book.objects.create(name=book_name, publisher_id=pub_id)

            # 返回重定向书籍展示页面
            return redirect('/book_list/')

    # 查询出来所有的出版社
    all_publisher = models.Publisher.objects.all()
    # get返回一个form表单
    return render(request, 'book_add.html', {'all_publisher': all_publisher, 'error': error})


@login_required
# 删除书籍
def book_del(request):
    # 获取连接中的id地址
    pk = request.GET.get('id')
    # 操作数据库删除对应的id
    models.Book.objects.filter(pk=pk).delete()
    # 回复一个重定向展示页面
    return redirect('/book_list/')


@login_required
# 修改书籍
def book_edit(request):
    # 接收数据ip
    pk = request.GET.get('id')
    # 根据pk查询到对象名字
    book_obj = models.Book.objects.get(pk=pk)
    if request.method == 'POST':
        # 获取修改后的书名
        book_name = request.POST.get('book_name')
        # 获取修改后的出版社名
        pub_id = request.POST.get('pub_id')

        # 替换数据库中的信息
        book_obj.name = book_name
        book_obj.publisher_id = pub_id

        # 保存到数据库
        book_obj.save()

        # 重定向展示页面
        return redirect('/book_list/')

    else:
        # 查询所有出版社
        all_publisher = models.Publisher.objects.all()
        # 返回一个带书籍名的
        return render(request, 'book_edit.html', {'book_obj': book_obj, 'all_publisher': all_publisher})


@login_required
# 展示作者
def author_list(request):
    # 查询所有作者信息
    all_author = models.Author.objects.all()
    # 返回一个get页面展示作者
    return render(request, 'author_list.html', {'all_author': all_author})


@login_required
# 新增作者
def author_add(request):
    # post请求
    if request.method == 'POST':
        # 接收数据
        author_name = request.POST.get('author_name')
        book_ids = request.POST.getlist('book_ids')  # 获取多个数据

        # 将作者数据写入数据库
        author_obj = models.Author.objects.create(name=author_name)
        # # 该作者和提交的书籍绑定多对多关系
        author_obj.books.set(book_ids)  # 设置多对多关系

        # 重定向页面
        return redirect('/author_list/')

    # book_id
    # author_name
    # get请求
    # 查询所有的书籍
    all_book = models.Book.objects.all()
    # 返回新增页面
    return render(request, 'author_add.html', {'all_book': all_book})


@login_required
# 删除作者
def author_del(request):
    # 获取作者id
    pk = request.GET.get('id')
    # 查询删除数据
    models.Author.objects.filter(pk=pk).delete()
    # 重定向回作者列表
    return redirect('/author_list/')


# 测试
def test(request):
    # 创建name列表
    name_list = ['小明', '小芳', '小亮']
    # 返回文件
    return render(request, 'test.html', {'name_list': name_list})


@login_required
# 删除合并
def delete(request, name, pk):  # 因为用到两个位置参数

    cls = getattr(models, name.capitalize())  # 用反射拿到类中的定义函数,并将首字母小写转化为大写
    cls.objects.filter(pk=pk).delete()

    return redirect(reverse(name))
